package com.shuang.graph15;

import java.util.*;
//拓扑排序 bfs 寻找入度为零的节点
public class Main{

    public static void main(String[] args){
        //设计输入
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int m = sc.nextInt();

        //定义一个集合（相当于邻接表）存 s到t的（知道s指向的都有哪些节点即知道了依赖关系）
        List<List<Integer>> grid = new ArrayList<>();
        for (int i = 0; i < n; i++){
            grid.add(new ArrayList<>());
        }

        //定义一个数组用于记录每个节点的入度
        int[] indgree =  new int[n];

        while (m-- != 0){
            int s = sc.nextInt();
            int t = sc.nextInt();

            grid.get(s).add(t);

            indgree[t]++;
        }

        //定义队列将入度为零的节点存到队列中
        Queue<Integer> que = new LinkedList<>();

        //遍历所有节点将入度为0的节点加入到队列中
        for (int i = 0; i < n; i++){
            if (indgree[i] == 0){
                que.add(i);
            }
        }

        //存放结果的集合
        List<Integer> result = new ArrayList<>();

        //从队列中取值
        while (!que.isEmpty()){
            //拿到入度为零的当前节点
            int cur = que.poll();

            //将其加入到结果集中
            result.add(cur);

            //找到当前节点相连的各个节点
            List<Integer> nodes = grid.get(cur);
            //遍历相连的所有节点 将其入度减1 相当于删除当前节点的操作 如果减完1之后这个节点的入度为0了就将其加到队列中
            for (int node : nodes){
                indgree[node]--;
                if (indgree[node] == 0){
                    que.add(node);
                }
            }
        }

        if (result.size() == n){
            //说明能处理成功 打印结果集合
            for (int i = 0; i < n - 1; i++){
                System.out.print(result.get(i) + " ");
            }
            System.out.println(result.get(n - 1));
            return;
        }

        //说明成环了 不能处理成功
        System.out.println(-1);
        return;
    }
}
 